#include "HX711.h"
// #include <math.h>

uint8_t HX711_SCK_PIN[2]={7,10};
uint8_t HX711_DOUT_PIN[2]={6,9};

uint32_t ref_num[2]={0};
uint32_t calibration[2]={1089,1072};


void HX711_init(){
    gpio_config_t io_conf;

    io_conf.intr_type = GPIO_INTR_DISABLE;   // 不使用中断
    io_conf.pin_bit_mask = (1ULL << HX711_SCK_PIN[0])|(1ULL << HX711_SCK_PIN[1]);  // 设置引脚 0
    io_conf.mode = GPIO_MODE_OUTPUT;         // 设置为输出模式
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE; // 不启用上拉
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; // 不启用下拉
    gpio_config(&io_conf);                   // 配置引脚
    
    gpio_set_level(HX711_SCK_PIN[0], 1);  // 设置为高电平
    gpio_set_level(HX711_SCK_PIN[1], 1);  // 设置为高电平

    // 配置 HX711_DOUT 引脚（GPIO 1）为输入，并启用上拉
    io_conf.pin_bit_mask = (1ULL << HX711_DOUT_PIN[0])|(1ULL << HX711_DOUT_PIN[1]);  // 设置引脚 1
    io_conf.mode = GPIO_MODE_INPUT;        // 设置为输入模式
    io_conf.pull_up_en = GPIO_PULLUP_ENABLE; // 启用上拉
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; // 不启用下拉
    gpio_config(&io_conf);                // 配置引脚
    
    delay_ms(100);
    ref_num[0]=HX711_Read(0);
    ref_num[1]=HX711_Read(1);

    // 此处可以添加 HX711 读取数据的逻辑
}

uint32_t HX711_Read(int j) {
    uint32_t count = 0; 
    uint8_t i; 
    
    // 将 DOUT 设置为 1
    gpio_set_level(HX711_DOUT_PIN[j], 1); 
    delay_us(1);

    // 设置 SCK 为 0
    gpio_set_level(HX711_SCK_PIN[j], 0); 
    
    // 等待 DOUT 为低
    while (gpio_get_level(HX711_DOUT_PIN[j]) == 1); 
    
    // 读取 24 位数据
    for (i = 0; i < 24; i++) { 
        gpio_set_level(HX711_SCK_PIN[j], 1);   // SCK 上升沿
        count = count << 1;  // 左移一位
        delay_us(1);
        gpio_set_level(HX711_SCK_PIN[j], 0);   // SCK 下降沿
        if (gpio_get_level(HX711_DOUT_PIN[j]) == 1) { 
            count++; 
        }
        delay_us(1); 
    } 
    
    // 读取完成后，SCK 上升沿
    gpio_set_level(HX711_SCK_PIN[j], 1); 
    count = count ^ 0x800000;  // 取反，得到 24 位补码
    delay_us(1);
    gpio_set_level(HX711_SCK_PIN[j], 0);  
    
    return count;  // 返回结果
}

float get_weight(int i){
    // ESP_LOGE("STRAIN","result should be %f",(float)(HX711_Read(i)-ref_num[i])/calibration[i]);
    return (((float)HX711_Read(i)-(float)ref_num[i])/calibration[i]);
}


void set_cali(int i,uint32_t num){
    calibration[i]=num;
    ESP_LOGE("STRAIN","calibration[%d] is %ld",i,calibration[i]);
}

void set_zero(){
    ref_num[0]=HX711_Read(0);
    ref_num[1]=HX711_Read(1);
}
void show_cali(){
    ESP_LOGE("STRAIN","calibration[%d] is %ld",0,calibration[0]);
    ESP_LOGE("STRAIN","calibration[%d] is %ld",1,calibration[1]);
}